#include "mainwindow.h"
#include <QPushButton>
#include <QDebug>
#include <QWidget>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    QPushButton *btn = new QPushButton;

    //btn->show(); 这个方法会单独开一个窗口
    btn->setParent(this); //放到了对象树上去了
    btn->setText("按钮内容不是窗口标题");
    btn->setWindowTitle("qt窗口");
    btn->resize(100,30);

    QPushButton *btn2 = new QPushButton;
    btn2->setParent(this);
    btn2->setText("按钮2");
    btn2->resize(100,30);
    btn2->move(0,40);

    QPushButton *closeBtn = new QPushButton;
    closeBtn->setParent(this);
    closeBtn->setText("关闭窗口");
    closeBtn->resize(100,30);
    closeBtn->move(0,80);

    // 参数1 信号的发送者  参数2 发送的信号(函数的地址)
    // 参数3 信号的接收者 参数4 槽函数(函数的地址)
    connect(closeBtn,&QPushButton::clicked,this,&QWidget::close);

    resize(600,600);


    //自定义的信号和槽
    this->tc = new Teacher(this);
    this->st = new Student(this);

    //只有无参信号的时候的写法
    //connect(tc,&Teacher::hungry,st,&Student::treat);//信号发生重载的时候 不能这样写
    //emit(tc->hungry());// 触发hungry信号

    //连接带参数的信号和槽  有函数重载的时候 需要用函数指针
    void( Teacher:: * teacherSignal)(QString) = &Teacher::hungry;
    void(Student:: *studentSlot)(QString) = &Student::treat;

    connect(tc,teacherSignal,st,studentSlot);
    emit(tc->hungry("牛肉"));

    //第一种方法 信号激发另一个信号
    QPushButton *signalBtn = new QPushButton("触发信号",this);
    signalBtn->move(0,120);

//    connect(signalBtn,&QPushButton::clicked,this,&MainWindow::classOver);

    //第二种方法  信号直接链接信号
    void( Teacher:: * teacherSignalVoid)(void) = &Teacher::hungry;
    void(Student:: *studentSlotVoid)(void) = &Student::treat;

    connect(tc,teacherSignalVoid,st,studentSlotVoid);
    connect(signalBtn,&QPushButton::clicked,tc,teacherSignalVoid);

    //断开信号
    disconnect(tc,teacherSignalVoid,st,studentSlotVoid);

    //信号和槽的参数类型必须一一对应
    //信号和槽是多对对的连接
    //信号的参数可以多于槽函数

    //lamda表达式
    [](){
        qDebug()<<"调用了lamda表达式";
    }();

    //获取作用域中的变量
    //1 =   将作用域中的变量值传递给表达式
    [btn](){
        btn->resize(120,30);
    }();
    //2 &   将作用域中的变量引用传递给表达式
    [&btn2](){
        btn2->setText("改变了文字");
    }();
    //3 this  可以是用所在类的成员
    //4 a      将 a 值传递
    //5 &a     将 a 引用传递
    //6 a,&b     将 a 值传递  b引用传递
    //7 =, &a,&b  除了a和b引用传递外 其他的值传递
    //8 &, a,b    除了a,b值传递外 其他引用传递

}

void MainWindow::classOver(){
    tc->hungry("第一种方法吃的东西");
}

MainWindow::~MainWindow()
{
    qDebug()<<"hello debug";
}

